iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
自我挑戰組

串接綠界服務的疑難雜症詳解系列 第 13

【綠界金流】URL百科 - ReturnURL

  • 分享至 

  • xImage
  •  

大家在串接綠界金流的時候
一定會發現文件內出現了各種URL參數
有些是必填
有些是選填

到底這些URL有甚麼用呢?

這些參數主要就是用來「接收」綠界回傳的交易結果通知
你必須在這些URL內帶入你的接收API
並且必須要將這些API對外 也就是讓綠界連得上
才有辦法成功收到交易結果通知

接下來的幾天就來帶大家了解各種URL的功能吧


ReturnURL

ReturnURL算是綠界金流裡最重要的一個了
它主要是用來「後端接收」綠界回傳交易結果通知

換句話說,當消費者完成交易後
不管是成功或失敗,綠界會以Server POST(後端)的方式,傳送交易結果至你的server
也就是當初你填的[ReturnURL]內
(若沒有完成交易,例如沒有填信用卡號直接關閉頁面,就不會回傳交易結果囉)

這樣說好了
假設,我寫了一支後端接收的程式,並用ngrok對外

https://552c-211-23-76-78.ngrok-free.app/hi/ReturnURL.php

那在呼叫「建立訂單」API時,
就要帶入

ReturnURL=>'https://552c-211-23-76-78.ngrok-free.app/hi/ReturnURL.php'

等消費者結束交易後
綠界會用Server POST的方式,將交易結果傳送至你的[ReturnURL]
至於收到交易結果後要做甚麼邏輯處理,就要寫你的[ReturnURL]裡面

舉例
我的[ReturnURL]在收到綠界回傳的payload後
想要把接收到的payload存成文字檔,那就可以這樣寫

<?php

// 取得 IP 地址
function getClientIP() {
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}

// 付款結果通知
try {
    date_default_timezone_set('Asia/Taipei');
    // 寫入檔案
    if (true) {
        $sLog_Path = __DIR__ . '/sample_payment_returnURL' . date('Ymd') . '.log'; // LOG路徑
        $sLog = '+++++++++++++++++++++++++++++++++++++++ 接收回傳參數 ' . date('Y-m-d H:i:s') . ' ++++++++++++++++++++++++++++++++++++++++++++' . "\n";
        $fp = fopen($sLog_Path, "a+");
        fputs($fp, $sLog);
        fclose($fp);
        
        // 紀錄來源IP
        $clientIP = getClientIP();
        $sLog_IP = '來源IP: ' . $clientIP . "\n";
        $fp = fopen($sLog_Path, "a+");
        fputs($fp, $sLog_IP);
        fclose($fp);

        // 紀錄請求方法
        $requestMethod = $_SERVER['REQUEST_METHOD'];
        $sLog_Method = '請求方法: ' . $requestMethod . "\n";
        $fp = fopen($sLog_Path, "a+");
        fputs($fp, $sLog_Method);
        fclose($fp);
        
        // 紀錄回傳的參數
        $sLog_File = file_get_contents("php://input") . "\n";
        $fp = fopen($sLog_Path, "a+");
        fputs($fp, $sLog_File);
        fclose($fp);
    }
    echo '1|OK';
} catch (Exception $e) {
    if (true) {
        $sLog_Path = __DIR__ . '/sample_payment_return' . date('Ymd') . '.log'; // LOG路徑
        $sLog = '+++++++++++++++++++++++++++++++++++++++ 接收回傳參數(ERROR) ' . date('Y-m-d H:i:s') . ' ++++++++++++++++++++++++++++++++++++++++++++' . "\n";
        $fp = fopen($sLog_Path, "a+");
        fputs($fp, $sLog);
        fclose($fp);

        $sLog_File = '0|' . $e->getMessage() . "\n";
        $fp = fopen($sLog_Path, "a+");
        fputs($fp, $sLog_File);
        fclose($fp);
    }
}
?>

所以當消費者完成付款,綠界呼叫我的[ReturnURL]後
就可以在我指定的位置找到綠界傳給我的payload囉!

https://ithelp.ithome.com.tw/upload/images/20240906/201688779TJvgD59t7.png

以上的ReturnURL僅供參考
大家再依照自己的程式邏輯
看是要寫進資料庫或是進行其他操作
都可以自行修改


這裡提供幾個ReturnURL的注意事項:

1.綠界僅支援HTTP和HTTPS(80 port 及 443 port)

如果你的ReturnURL有指定port,
例如指定3300 port

https://sample.app:3300/hi/ReturnURL.php

就會收不到綠界回傳交易結果囉

2.記得回傳1|OK

在你的ReturnURL收到綠界通知後有兩件事必須要做:

  • 驗證綠界回傳通知內的CheckMacValue是否正確
    驗證方式之前文章有提過
    必須先將回傳參數中的CheckMacValue移除
    將剩餘的所有參數與參數值進行驗算
    得出的結果要和先前移除的[CheckMacValue]一致才可以哦

  • 回傳1|OK
    當驗算CheckMacValue無誤
    確認是綠界回傳的payload後
    記得要回傳1|OK給綠界
    綠界會依此訊息判斷你是否有收到回傳

如果回錯格式就會觸發綠界的「重發機制」囉
至於甚麼是重發機制,以及可能造成的影響
等後面介紹到「模擬付款」的篇章再詳細介紹


以上,就是今天的「ReturnURL」介紹
有任何問題都可以底下留言

我們明天見


上一篇
【綠界金流】信用卡退刷 - 常見問題
下一篇
【綠界金流】URL百科 - OrderResultURL
系列文
串接綠界服務的疑難雜症詳解22
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言